home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tex / macros / source / contrib / fp / fp-trigo.sty < prev    next >
Text File  |  1995-03-09  |  29KB  |  1,121 lines

  1. \NeedsTeXFormat{LaTeX2e}
  2. \ProvidesPackage{fp-trigo}[1994/11/19]
  3.  
  4. %version information
  5. \def\FP@trigoversion{0.9a}
  6. \message{%
  7.   `Fixed Point Trigonometry',%
  8.   \space\space\space\space\space%
  9.   Version \FP@trigoversion%
  10.   \space(C) Michael Mehlich%
  11. }
  12.  
  13. %resolve dependencies
  14. \RequirePackage{fp-basic}
  15.  
  16. %%%public area (macros which may be used)%%%
  17.  
  18. %constants
  19. \edef\FPpi{3.141592653589793238}
  20.  
  21. %unary functions
  22. \def\FPsin#1#2{\FP@calld\FP@sin#1{#2}}
  23. \def\FPcos#1#2{\FP@calld\FP@cos#1{#2}}
  24. \def\FPsincos#1#2#3{\FP@calle\FP@sincos#1#2{#3}}
  25. \def\FPtan#1#2{\FP@calld\FP@tan#1{#2}}
  26. \def\FPcot#1#2{\FP@calld\FP@cot#1{#2}}
  27. \def\FPtancot#1#2#3{\FP@calle\FP@tancot#1#2{#3}}
  28. \def\FParcsin#1#2{\FP@calld\FP@arcsin#1{#2}}
  29. \def\FParccos#1#2{\FP@calld\FP@arccos#1{#2}}
  30. \def\FParcsincos#1#2#3{\FP@calle\FP@arcsincos#1#2{#3}}
  31. \def\FParctan#1#2{\FP@calld\FP@arctan#1{#2}}
  32. \def\FParccot#1#2{\FP@calld\FP@arccot#1{#2}}
  33. \def\FParctancot#1#2#3{\FP@calle\FP@arctancot#1#2{#3}}
  34.  
  35. %%%private fp-area (don't use these macros)%%%
  36.  
  37. %allocate registers
  38.  
  39. \countdef\FP@ls=50
  40. \countdef\FP@lfa=51
  41. \countdef\FP@lfb=52
  42.  
  43. \countdef\FP@loops=53
  44. \countdef\FP@oct=54
  45.  
  46. \countdef\FP@@arccos=55
  47. \countdef\FP@oldvala=56
  48. \countdef\FP@oldvalb=57
  49. \countdef\FP@subfpih=58
  50.  
  51. %compute 0<=x<2pi for value 2pi*n + x
  52.  
  53. \def\FP@modtwopi#1#2{%result is the family {x}
  54.   % #1 integer part of value
  55.   % #2 fractional part of value
  56.   \FP@readvalue{x}{#1}{#2}%
  57.   %
  58.   \ifFP@zero{x}%
  59.     \def\next##1{}%
  60.   \else%
  61.     \def\next##1{##1}%
  62.   \fi%
  63.    %
  64.    \next%
  65.      {%compute modulo without caring about sign
  66.       \FP@shift=0\relax%
  67.       \FP@ys=1\FP@yia=628318530\FP@yib=717958647\FP@yfa=692528676\FP@yfb=655900577\relax%2*pi
  68.       \loop%
  69.         \ifnum\FP@xia<100000000\relax%
  70.        \FP@multen{x}%
  71.        \advance\FP@shift-1\relax%
  72.     \repeat%
  73.       \FP@loops=18\relax\advance\FP@loops\FP@shift%
  74.       \loop%
  75.         \ifnum\FP@loops=0\else%
  76.        \advance\FP@loops-1\relax%
  77.        \FP@counttimes%divides x by \FP@times*y
  78.        \FP@divten{y}%
  79.     \repeat%
  80.       \loop%
  81.         \ifnum\FP@shift<0%
  82.       \advance\FP@shift1\relax%
  83.       \FP@divten{x}%
  84.     \repeat%
  85.       %
  86.       %correct the result for negative values (modulo is positive)
  87.       \loop%should be computed only once
  88.         \ifnum\FP@xs<0\relax%
  89.       \advance\FP@xfb-179586477\relax\FP@xfb=-\FP@xfb%
  90.       \ifnum\FP@xfb<0\relax%
  91.         \advance\FP@xfb1000000000\relax%
  92.         \advance\FP@xfa1\relax%
  93.       \fi%
  94.       \advance\FP@xfa-283185307\relax\FP@xfa=-\FP@xfa%
  95.       \ifnum\FP@xfa<0\relax%
  96.         \advance\FP@xfa1000000000\relax%
  97.         \advance\FP@xib1\relax%
  98.       \fi%
  99.       \advance\FP@xib-6\relax\FP@xib=-\FP@xib%
  100.       \ifnum\FP@xib<0%
  101.         \FP@errmessage{Error in calculation: This shouldn't happen!}%
  102.       \else%
  103.         \FP@xs=1\relax%
  104.       \fi%
  105.         \repeat%
  106.      }%
  107. }
  108.  
  109. %auxiliary functions
  110.  
  111. \def\FP@trigocmpsval#1#2#3{%
  112.   % #1 macro, which gets the result
  113.   % #2 9 digits integer value
  114.   % #3 9 digits integer value
  115.   \ifnum#2<#3\relax%
  116.     #1=-1\relax%
  117.   \else\ifnum#2>#3\relax%
  118.     #1=1\relax%
  119.   \else%
  120.     #1=0\relax%
  121.   \fi\fi%
  122. }
  123.  
  124. \def\FP@trigocmpval#1#2#3#4#5#6#7{%
  125.   % #1 macro, which gets the result
  126.   % #2 9 digits integer value
  127.   % #3 9 digits integer value
  128.   % #4 9 digits integer value
  129.   % #5 9 digits integer value
  130.   % #6 9 digits integer value
  131.   % #7 9 digits integer value
  132.   %
  133.   \FP@trigocmpsval#1{#2}{#5}%
  134.   \ifnum#1=0\relax\FP@trigocmpsval#1{#3}{#6}\relax\fi%
  135.   \ifnum#1=0\relax\FP@trigocmpsval#1{#4}{#7}\relax\fi%
  136. }
  137.  
  138. \def\FP@trigosub#1#2#3#4#5#6{%
  139.   % #1 resulting fractional part one
  140.   % #2 resulting fractional part two
  141.   % #3 1st value fractional part one
  142.   % #4 1st value fractional part two
  143.   % #5 2nd value fractional part one
  144.   % #6 2nd value fractional part two
  145.   \FP@rfb=#4\relax\advance\FP@rfb-#6\relax%
  146.   \FP@rfa=#3\relax\advance\FP@rfa-#5\relax%
  147.   \ifnum\FP@rfb<0\relax%
  148.     \advance\FP@rfa-1\relax%
  149.     \advance\FP@rfb1000000000\relax%
  150.   \fi%
  151.   \ifnum\FP@rfa<0\relax%
  152.     \advance\FP@rfa1000000000\relax%
  153.   \fi%
  154.   #1=\FP@rfa%
  155.   #2=\FP@rfb%
  156. }
  157.  
  158. %compute octand of value and transform value to one between 0 and pi/4
  159.  
  160. \def\FP@octand#1#2{%resulting values \FP@oct, family {x}
  161.   % #1 integer part of value
  162.   % #2 fractional part of value
  163.   %
  164.   \FP@modtwopi{#1}{#2}%
  165.   %now it is 0<={x}<2pi
  166.   %
  167.   \FP@trigocmpval\FP@oct\FP@xib\FP@xfa\FP@xfb{3}{141592653}{589793238}%
  168.   \ifnum\FP@oct>0\relax%
  169.      \FP@trigocmpval\FP@oct\FP@xib\FP@xfa\FP@xfb{4}{712388980}{384689858}%
  170.      \ifnum\FP@oct>0\relax%
  171.         \FP@trigocmpval\FP@oct\FP@xib\FP@xfa\FP@xfb{5}{497787143}{782138167}%
  172.     \ifnum\FP@oct>0\relax%
  173.        \FP@oct=7\relax%
  174.        \FP@trigosub\FP@xfa\FP@xfb{283185307}{179586477}\FP@xfa\FP@xfb%
  175.     \else%
  176.        \FP@oct=6\relax%
  177.        \FP@trigosub\FP@xfa\FP@xfb\FP@xfa\FP@xfb{712388980}{384689858}%
  178.     \fi%
  179.      \else%
  180.         \FP@trigocmpval\FP@oct\FP@xib\FP@xfa\FP@xfb{3}{926990816}{987241548}%
  181.     \ifnum\FP@oct>0\relax%
  182.        \FP@oct=5\relax%
  183.        \FP@trigosub\FP@xfa\FP@xfb{712388980}{384689858}\FP@xfa\FP@xfb%
  184.     \else%
  185.        \FP@oct=4\relax%
  186.        \FP@trigosub\FP@xfa\FP@xfb\FP@xfa\FP@xfb{141592653}{589793238}%
  187.     \fi%
  188.      \fi%
  189.   \else%
  190.      \FP@trigocmpval\FP@oct\FP@xib\FP@xfa\FP@xfb{1}{570796326}{794896619}%
  191.      \ifnum\FP@oct>0\relax%
  192.         \FP@trigocmpval\FP@oct\FP@xib\FP@xfa\FP@xfb{2}{356194490}{192344929}%
  193.     \ifnum\FP@oct>0\relax%
  194.        \FP@oct=3\relax%
  195.        \FP@trigosub\FP@xfa\FP@xfb{141592653}{589793238}\FP@xfa\FP@xfb%
  196.     \else%
  197.        \FP@oct=2\relax%
  198.        \FP@trigosub\FP@xfa\FP@xfb\FP@xfa\FP@xfb{570796326}{794896619}%
  199.     \fi%
  200.      \else%
  201.         \FP@trigocmpval\FP@oct\FP@xib\FP@xfa\FP@xfb{0}{785398163}{397448310}%
  202.     \ifnum\FP@oct>0\relax%
  203.        \FP@oct=1\relax%
  204.        \FP@trigosub\FP@xfa\FP@xfb{570796326}{794896619}\FP@xfa\FP@xfb%
  205.     \else%
  206.        \FP@oct=0\relax%
  207.     \fi%
  208.      \fi%
  209.   \fi%
  210.   %
  211.   \FP@xib=0\relax%
  212. }
  213.  
  214. %auxiliary functions
  215.  
  216. \def\FP@trigo@mul#1#2#3#4#5#6{%
  217.   % #1 macro which gets fractional part 1
  218.   % #2 macro which fractional part 1
  219.   % #3 first value part 1
  220.   % #4 first value part 2
  221.   % #5 second value part 1
  222.   % #6 second value part 2
  223.   \FP@split\FP@xq\FP@xr\FP@xz{#3} \FP@split\FP@xt\FP@xu\FP@xv{#4}%
  224.   \FP@split\FP@yq\FP@yr\FP@yz{#5} \FP@split\FP@yt\FP@yu\FP@yv{#6}%
  225.   \FP@prod=0\relax%
  226.   \edef\FP@rd{}%
  227.   \FP@@mul vv             \relax\FP@saveshift%
  228.   \FP@@mul vu uv         \relax\FP@saveshift%
  229.   \FP@@mul uu vt tv         \relax\FP@saveshift%
  230.   \FP@@mul ut tu vz zv         \relax\FP@saveshift%
  231.   \FP@@mul tt uz zu vr rv     \relax\FP@saveshift%
  232.   \FP@@mul zt tz ur ru qv vq     \relax\FP@saveshift%
  233.   \FP@@mul zz rt tr qu uq     \relax\FP@saveshift%
  234.   \FP@@mul rz zr qt tq         \relax\FP@saveshift%
  235.   \FP@@mul rr qz zq         \relax\FP@saveshift%
  236.   \FP@@mul qr rq         \relax\FP@saveshift%
  237.   \FP@@mul qq             \relax\FP@saveshift\FP@saveshift%
  238.   \FP@ninesplit\FP@rd#1=\FP@res%
  239.   \FP@ninesplit\FP@rd#2=\FP@res%
  240. }
  241.  
  242. \def\FP@trigo@divn#1#2#3#4#5{%
  243.   % #1 macro which gets fractional part 1
  244.   % #2 macro which gets fractional part 2
  245.   % #3 value part 1
  246.   % #4 value part 2
  247.   % #5 integer (0,..,1000)
  248.   \FP@rega=#3\divide\FP@rega#5%
  249.   \FP@regd=\FP@rega%
  250.   \multiply\FP@rega#5%
  251.   \advance\FP@rega-#3
  252.   \multiply\FP@rega-1000\relax%
  253.   \FP@regb=#4\divide\FP@regb1000000\relax%
  254.   \advance\FP@rega\FP@regb%
  255.   \FP@regc=\FP@rega\divide\FP@regc#5%
  256.   \FP@rege=\FP@regc\multiply\FP@rege1000000\relax%
  257.   \multiply\FP@regc#5\advance\FP@rega-\FP@regc\multiply\FP@rega1000000\relax%
  258.   \multiply\FP@regb1000000\relax\advance\FP@regb-#4%
  259.   \advance\FP@rega-\FP@regb%
  260.   \divide\FP@rega#5%
  261.   \advance\FP@rege\FP@rega%
  262.   #1=\FP@regd%
  263.   #2=\FP@rege%
  264. }
  265.  
  266. %sine and cosine
  267.  
  268. \def\FP@sincos@loop#1#2{%
  269.   % #1 fractional part 1 of value
  270.   % #2 fractional part 2 of value
  271.   \loop%
  272.      \FP@ls=-\FP@ls%
  273.      \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb{#1}{#2}%
  274.      \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb{#1}{#2}%
  275.      \FP@trigo@divn\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@count%
  276.      \advance\FP@count1\relax%
  277.      \FP@trigo@divn\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@count%
  278.      \advance\FP@count1\relax%
  279.      \ifnum\ifnum\FP@lfa=0 0\else1\fi\ifnum\FP@lfb=0 0\else1\fi>0\relax
  280.         \ifnum\FP@ls>0\relax%
  281.           \advance\FP@rfa\FP@lfa%
  282.       \advance\FP@rfb\FP@lfb%
  283.       \ifnum\FP@rfb<1000000000\relax\else%
  284.         \advance\FP@rfa1\relax%
  285.         \advance\FP@rfb-1000000000\relax%
  286.       \fi%
  287.       \ifnum\FP@rfa<1000000000\relax\else%
  288.         \advance\FP@rib1\relax%
  289.         \advance\FP@rfa-1000000000\relax%
  290.       \fi%
  291.         \else%
  292.           \advance\FP@rfa-\FP@lfa%
  293.       \advance\FP@rfb-\FP@lfb%
  294.       \ifnum\FP@rfb<0\relax%
  295.         \advance\FP@rfa-1\relax%
  296.         \advance\FP@rfb1000000000\relax%
  297.       \fi%
  298.       \ifnum\FP@rfa<0\relax%
  299.         \advance\FP@rib-1\relax%
  300.         \advance\FP@rfa1000000000\relax%
  301.       \fi%
  302.         \fi%
  303.      \repeat%
  304. }
  305.  
  306. %sine for values 0<=v<=pi/4
  307. \def\FP@@sin#1#2{%
  308.   % #1 fractional part 1
  309.   % #2 fractional part 2
  310.   \ifnum\ifnum#1=0 0\else1\fi\ifnum#2=0 0\else1\fi=0\relax%
  311.     \FP@rs=1\FP@ria=0\FP@rib=0\FP@rfa=0\FP@rfb=0\relax%
  312.   \else%
  313.     \FP@rs=1\FP@ria=0\FP@rib=0\FP@rfa=#1\FP@rfb=#2\relax%
  314.     \FP@ls=1\FP@lfa=#1\FP@lfb=#2\relax%
  315.     \FP@count=2\relax%
  316.     \FP@sincos@loop{#1}{#2}%
  317.   \fi%
  318. }
  319.      
  320. %cosine for values 0<=v<=pi/4
  321. \def\FP@@cos#1#2{%
  322.   % #1 fractional part 1
  323.   % #2 fractional part 2
  324.   \ifnum\ifnum#1=0 0\else1\fi\ifnum#2=0 0\else1\fi=0\relax%
  325.     \FP@rs=1\FP@ria=0\FP@rib=1\FP@rfa=0\FP@rfb=0\relax%
  326.   \else%
  327.     \FP@ls=-1\FP@lfa=#1\FP@lfb=#2\relax%
  328.     \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@lfa\FP@lfb%
  329.     \FP@trigo@divn\FP@lfa\FP@lfb\FP@lfa\FP@lfb{2}%
  330.     \FP@count=3\relax%
  331.     \FP@rs=1\FP@ria=0\FP@rib=0
  332.     \ifnum\FP@lfb=0\relax%
  333.       \FP@rfa=1000000000\FP@rfb=0\relax%
  334.     \else%
  335.       \FP@rfa=999999999\FP@rfb=1000000000\relax%
  336.     \fi%
  337.     \advance\FP@rfb-\FP@lfb\advance\FP@rfa-\FP@lfa%
  338.     \FP@sincos@loop{#1}{#2}%
  339.   \fi%
  340. }
  341.      
  342. \def\FP@sin#1#2.#3.#4\relax{%
  343.   % #1 macro, which gets the result
  344.   % #2 integer part of value
  345.   % #3 fractional part of value
  346.   % #4 dummy to swallow everything after the 2nd '.'
  347.   %
  348.   \FP@beginmessage{SIN}
  349.   %
  350.   {\FP@octand{#2}{#3}%
  351.    %
  352.    \ifnum\FP@oct<4\relax%
  353.      \ifnum\FP@oct<2\relax%
  354.        \ifnum\FP@oct<1\relax%
  355.          \FP@@sin\FP@xfa\FP@xfb%
  356.        \else%
  357.          \FP@@cos\FP@xfa\FP@xfb%
  358.        \fi%
  359.      \else%
  360.        \ifnum\FP@oct<3\relax%
  361.          \FP@@cos\FP@xfa\FP@xfb%
  362.        \else%
  363.          \FP@@sin\FP@xfa\FP@xfb%
  364.        \fi%
  365.      \fi%
  366.    \else%
  367.      \ifnum\FP@oct<6\relax%
  368.        \ifnum\FP@oct<5\relax%
  369.          \FP@@sin\FP@xfa\FP@xfb%
  370.      \FP@rs=-\FP@rs%
  371.        \else%
  372.          \FP@@cos\FP@xfa\FP@xfb%
  373.      \FP@rs=-\FP@rs%
  374.        \fi%
  375.      \else%
  376.        \ifnum\FP@oct<7\relax%
  377.          \FP@@cos\FP@xfa\FP@xfb%
  378.      \FP@rs=-\FP@rs%
  379.        \else%
  380.          \FP@@sin\FP@xfa\FP@xfb%
  381.      \FP@rs=-\FP@rs%
  382.        \fi%
  383.      \fi%
  384.    \fi%
  385.    %
  386.    \FP@store\FP@tmp{r}%
  387.    \global\let\FP@tmp\FP@tmp%
  388.   }%
  389.   %
  390.   \FP@endmessage{}%
  391.   %
  392.   \let#1\FP@tmp%
  393. }
  394.  
  395. \def\FP@cos#1#2.#3.#4\relax{%
  396.   % #1 macro, which gets the result
  397.   % #2 integer part of value
  398.   % #3 fractional part of value
  399.   % #4 dummy to swallow everything after the 2nd '.'
  400.   %
  401.   \FP@beginmessage{COS}%
  402.   %
  403.   {\FP@octand{#2}{#3}%
  404.    %
  405.    \ifnum\FP@oct<4\relax%
  406.      \ifnum\FP@oct<2\relax%
  407.        \ifnum\FP@oct<1\relax%
  408.          \FP@@cos\FP@xfa\FP@xfb%
  409.        \else%
  410.          \FP@@sin\FP@xfa\FP@xfb%
  411.        \fi%
  412.      \else%
  413.        \ifnum\FP@oct<3\relax%
  414.          \FP@@sin\FP@xfa\FP@xfb%
  415.      \FP@rs=-\FP@rs%
  416.        \else%
  417.          \FP@@cos\FP@xfa\FP@xfb%
  418.      \FP@rs=-\FP@rs%
  419.        \fi%
  420.      \fi%
  421.    \else%
  422.      \ifnum\FP@oct<6\relax%
  423.        \ifnum\FP@oct<5\relax%
  424.          \FP@@cos\FP@xfa\FP@xfb%
  425.      \FP@rs=-\FP@rs%
  426.        \else%
  427.          \FP@@sin\FP@xfa\FP@xfb%
  428.      \FP@rs=-\FP@rs%
  429.        \fi%
  430.      \else%
  431.        \ifnum\FP@oct<7\relax%
  432.          \FP@@sin\FP@xfa\FP@xfb%
  433.        \else%
  434.          \FP@@cos\FP@xfa\FP@xfb%
  435.        \fi%
  436.      \fi%
  437.    \fi%
  438.    %
  439.    \FP@store\FP@tmp{r}%
  440.    \global\let\FP@tmp\FP@tmp%
  441.   }%
  442.   %
  443.   \FP@endmessage{}%
  444.   %
  445.   \let#1\FP@tmp%
  446. }
  447.  
  448. \def\FP@@sincos#1#2{%
  449.   % #1 integer part of value
  450.   % #2 fractional part of value
  451.   %
  452.   \FP@octand{#1}{#2}%
  453.   %
  454.   \ifnum\FP@oct<4\relax%
  455.     \ifnum\FP@oct<2\relax%
  456.       \ifnum\FP@oct<1\relax%
  457.         \FP@@sin\FP@xfa\FP@xfb%
  458.         \FP@store\FP@tmpc{r}%
  459.         \FP@@cos\FP@xfa\FP@xfb%
  460.         \FP@store\FP@tmpb{r}%
  461.       \else%
  462.         \FP@@cos\FP@xfa\FP@xfb%
  463.         \FP@store\FP@tmpc{r}%
  464.         \FP@@sin\FP@xfa\FP@xfb%
  465.         \FP@store\FP@tmpb{r}%
  466.       \fi%
  467.     \else%
  468.       \ifnum\FP@oct<3\relax%
  469.         \FP@@cos\FP@xfa\FP@xfb%
  470.         \FP@store\FP@tmpc{r}%
  471.         \FP@@sin\FP@xfa\FP@xfb%
  472.     \FP@rs=-\FP@rs%
  473.         \FP@store\FP@tmpb{r}%
  474.       \else%
  475.         \FP@@sin\FP@xfa\FP@xfb%
  476.         \FP@store\FP@tmpc{r}%
  477.         \FP@@cos\FP@xfa\FP@xfb%
  478.         \FP@rs=-\FP@rs%
  479.         \FP@store\FP@tmpb{r}%
  480.       \fi%
  481.     \fi%
  482.   \else%
  483.     \ifnum\FP@oct<6\relax%
  484.       \ifnum\FP@oct<5\relax%
  485.         \FP@@sin\FP@xfa\FP@xfb%
  486.         \FP@rs=-\FP@rs%
  487.         \FP@store\FP@tmpc{r}%
  488.         \FP@@cos\FP@xfa\FP@xfb%
  489.     \FP@rs=-\FP@rs%
  490.         \FP@store\FP@tmpb{r}%
  491.       \else%
  492.         \FP@@cos\FP@xfa\FP@xfb%
  493.         \FP@rs=-\FP@rs%
  494.         \FP@store\FP@tmpc{r}%
  495.         \FP@@sin\FP@xfa\FP@xfb%
  496.     \FP@rs=-\FP@rs%
  497.         \FP@store\FP@tmpb{r}%
  498.       \fi%
  499.     \else%
  500.       \ifnum\FP@oct<7\relax%
  501.         \FP@@cos\FP@xfa\FP@xfb%
  502.         \FP@rs=-\FP@rs%
  503.         \FP@store\FP@tmpc{r}%
  504.         \FP@@sin\FP@xfa\FP@xfb%
  505.         \FP@store\FP@tmpb{r}%
  506.       \else%
  507.         \FP@@sin\FP@xfa\FP@xfb%
  508.         \FP@rs=-\FP@rs%
  509.         \FP@store\FP@tmpc{r}%
  510.         \FP@@cos\FP@xfa\FP@xfb%
  511.         \FP@store\FP@tmpb{r}%
  512.       \fi%
  513.     \fi%
  514.   \fi%
  515. }
  516.  
  517. \def\FP@sincos#1#2#3.#4.#5\relax{%
  518.   % #1 macro, which gets the sine result
  519.   % #2 macro, which gets the cosine result
  520.   % #3 integer part of value
  521.   % #4 fractional part of value
  522.   % #5 dummy to swallow everything after the 2nd '.'
  523.   %
  524.   {\FP@beginmessage{SINCOS}%
  525.    %
  526.    \FP@@sincos{#3}{#4}%
  527.    %
  528.    \global\let\FP@tmpc\FP@tmpc%sine
  529.    \global\let\FP@tmpb\FP@tmpb%cosine
  530.    %
  531.    \FP@endmessage{}%
  532.   }%
  533.   %
  534.   \let#1\FP@tmpc%
  535.   \let#2\FP@tmpb%
  536.  }
  537.  
  538. %tan and cot
  539.  
  540. \def\FP@tan#1#2.#3.#4\relax{%
  541.   % #1 macro, which gets the result
  542.   % #2 integer part of value
  543.   % #3 fractional part of value
  544.   % #4 dummy to swallow everything after the 2nd '.'
  545.   %
  546.   \FP@beginmessage{TAN}%
  547.   %
  548.   {\def\FP@beginmessage##1{}%
  549.    \def\FP@endmessage##1{}%
  550.    %
  551.    \FP@@sincos{#2}{#3}%
  552.    %
  553.    \FPdiv\FP@tmp\FP@tmpc\FP@tmpb%
  554.    %
  555.    \global\let\FP@tmp\FP@tmp%
  556.   }%
  557.   %
  558.   \FP@endmessage{}%
  559.   %
  560.   \let#1\FP@tmp%
  561. }
  562.  
  563. \def\FP@cot#1#2.#3.#4\relax{%
  564.   % #1 macro, which gets the result
  565.   % #2 integer part of value
  566.   % #3 fractional part of value
  567.   % #4 dummy to swallow everything after the 2nd '.'
  568.   %
  569.   \FP@beginmessage{COT}%
  570.   %
  571.   {\def\FP@beginmessage##1{}%
  572.    \def\FP@endmessage##1{}%
  573.    %
  574.    \FP@@sincos{#2}{#3}%
  575.    %
  576.    \FPdiv\FP@tmp\FP@tmpb\FP@tmpc%
  577.    %
  578.    \global\let\FP@tmp\FP@tmp%
  579.   }%
  580.   %
  581.   \FP@endmessage{}%
  582.   %
  583.   \let#1\FP@tmp%
  584. }
  585.  
  586. \def\FP@tancot#1#2#3.#4.#5\relax{%
  587.   % #1 macro, which gets the tan result
  588.   % #1 macro, which gets the cot result
  589.   % #3 integer part of value
  590.   % #4 fractional part of value
  591.   % #5 dummy to swallow everything after the 2nd '.'
  592.   %
  593.   \FP@beginmessage{TANCOT}%
  594.   %
  595.   {\def\FP@beginmessage##1{}%
  596.    \def\FP@endmessage##1{}%
  597.    %
  598.    \FP@@sincos{#3}{#4}%
  599.    %
  600.    \FPdiv\FP@tmpd\FP@tmpc\FP@tmpb%
  601.    \FPdiv\FP@tmp\FP@tmpb\FP@tmpc%
  602.    %
  603.    \global\let\FP@tmpd\FP@tmpd%
  604.    \global\let\FP@tmp\FP@tmp%
  605.   }%
  606.   %
  607.   \FP@endmessage{}%
  608.   %
  609.   \let#1\FP@tmpd%
  610.   \let#2\FP@tmp%
  611. }
  612.  
  613. %auxiliary functions
  614.  
  615. % compute x/(x+1) for 0<=x<=1000000
  616. \def\FP@trigo@xy#1#2#3{%
  617.   % #1 macro, which gets fractional part 1
  618.   % #2 macro, which gets fractional part 2
  619.   % #3 natural number
  620.   \FP@rega=#3\relax\FP@regb=\FP@rega\advance\FP@regb1\relax%
  621.   \multiply\FP@rega1000\relax%
  622.   \FP@regc=\FP@rega\divide\FP@regc\FP@regb
  623.   #1=\FP@regc%
  624.   \multiply\FP@regc\FP@regb\advance\FP@rega-\FP@regc%
  625.   \multiply\FP@rega1000\relax%
  626.   \FP@regc=\FP@rega\divide\FP@regc\FP@regb%
  627.   \multiply#11000\relax\advance#1\FP@regc%
  628.   \multiply\FP@regc\FP@regb\advance\FP@rega-\FP@regc%
  629.   \multiply\FP@rega1000\relax%
  630.   \FP@regc=\FP@rega\divide\FP@regc\FP@regb%
  631.   \multiply#11000\relax\advance#1\FP@regc%
  632.   \multiply\FP@regc\FP@regb\advance\FP@rega-\FP@regc%
  633.   \multiply\FP@rega1000\relax%
  634.   \FP@regc=\FP@rega\divide\FP@regc\FP@regb%
  635.   #2=\FP@regc%
  636.   \multiply\FP@regc\FP@regb\advance\FP@rega-\FP@regc%
  637.   \multiply\FP@rega1000\relax%
  638.   \FP@regc=\FP@rega\divide\FP@regc\FP@regb%
  639.   \multiply#21000\relax\advance#2\FP@regc%
  640.   \multiply\FP@regc\FP@regb\advance\FP@rega-\FP@regc%
  641.   \multiply\FP@rega1000\relax%
  642.   \FP@regc=\FP@rega\divide\FP@regc\FP@regb%
  643.   \multiply#21000\relax\advance#2\FP@regc%
  644.   \multiply\FP@regc\FP@regb\advance\FP@rega-\FP@regc%
  645. }
  646.  
  647. %if x<=0.707106781 then x:=y else x:=y with x^2 + y^2 = 1
  648. %sets \FP@@arccos to 0 if x:=y otherwise to 1
  649. \def\FP@sincos@transform@Rii{%
  650.   \ifnum\FP@xfa>707106781\relax%
  651.     \FP@@arccos=1\relax%
  652.     \FP@trigo@mul\FP@rfa\FP@rfb\FP@xfa\FP@xfb\FP@xfa\FP@xfb%
  653.     \FP@lfa=1000000000\relax%
  654.     \advance\FP@lfa-\FP@rfa%
  655.     \ifnum\FP@rfb>0\relax%
  656.       \advance\FP@lfa-1\relax%
  657.       \FP@lfb=1000000000\relax%
  658.       \advance\FP@lfb-\FP@rfb%
  659.     \else%
  660.       \FP@lfb=0\relax%
  661.     \fi%
  662.     \FP@xia=710000000\FP@xib0\relax%
  663.     \FP@xfa=0\FP@xfb=0\relax%
  664.     \FP@oldvala=0\FP@oldvalb=0\relax%
  665.     \loop%
  666.       \ifnum\ifnum\FP@xia=\FP@xfa0\else1\fi\ifnum\FP@xib=\FP@xfb0\else1\fi>0\relax%
  667.         \FP@rfa\FP@xia\advance\FP@rfa\FP@xfa%
  668.     \FP@rfb\FP@xib\advance\FP@rfb\FP@xfb%
  669.     \divide\FP@rfb2\relax%
  670.     \ifodd\FP@rfa\advance\FP@rfb500000000\relax\fi%
  671.     \divide\FP@rfa2\relax%
  672.     \ifnum\FP@rfb<1000000000\relax\else%
  673.       \advance\FP@rfb-1000000000\relax%
  674.       \advance\FP@rfa1\relax%
  675.     \fi%
  676.     \FP@trigo@mul\FP@ria\FP@rib\FP@rfa\FP@rfb\FP@rfa\FP@rfb%
  677.     \ifnum\FP@ria<\FP@lfa%
  678.       \FP@oct=1\relax%
  679.     \else\ifnum\FP@ria>\FP@lfa%
  680.       \FP@oct=2\relax%
  681.     \else\ifnum\FP@rib<\FP@lfb%
  682.       \FP@oct=1\relax%
  683.     \else\ifnum\FP@rib>\FP@lfb%
  684.       \FP@oct=2\relax%
  685.     \else%
  686.       \FP@oct=3\relax%
  687.     \fi\fi\fi\fi%
  688.     \ifnum\ifnum\FP@ria=\FP@oldvala0\else1\fi\ifnum\FP@rib=\FP@oldvalb0\else1\fi>0\relax%
  689.       \FP@oldvala=\FP@ria\FP@oldvalb=\FP@rib%
  690.     \else%
  691.       \FP@oct=3\relax%
  692.     \fi%
  693.     \ifodd\FP@oct%
  694.       \FP@xfa\FP@rfa\FP@xfb\FP@rfb%
  695.     \fi%
  696.     \ifnum\FP@oct>1\relax%
  697.       \FP@xia\FP@rfa\FP@xib\FP@rfb%
  698.     \fi%
  699.       \repeat%
  700.   \else%
  701.     \FP@@arccos=0\relax%
  702.   \fi%
  703. }
  704.  
  705. %compute arcsin(abs(x)) resp. arccos(abs(x)) for -1<=x<=1
  706. %\FP@@arccos determines whether arcsin or arccos has been computed
  707. \def\FP@arcsincos@loop{%
  708.   \FP@@arccos=0\relax%
  709.   \ifnum\ifnum\FP@xia=0 1\else0\fi\ifnum\FP@xib<2 1\else 0\fi>0\relax%
  710.     \ifnum\FP@xib=1\relax%
  711.       \ifnum\ifnum\FP@xfa=0 1\else0\fi\ifnum\FP@xfb=0 1\else0\fi>0\relax%
  712.         \FP@rs=1\FP@ria=0\FP@rib=1\FP@rfa=570796326\FP@rfb=794896619\relax%
  713.       \else%
  714.         \FP@errmessage{Number too big}%
  715.       \fi%
  716.     \else%
  717.        \ifnum\ifnum\FP@xfa=0 0\else1\fi\ifnum\FP@xfb=0 0\else1\fi=0\relax%
  718.          \FP@rs=1\FP@ria=0\FP@rib=0\FP@rfa=0\FP@rfb=0\relax%
  719.        \else%
  720.          \FP@sincos@transform@Rii%
  721.          \FP@rs=1\FP@ria=0\FP@rib=0\FP@rfa=\FP@xfa\FP@rfb=\FP@xfb%
  722.      \FP@ls=1\FP@lfa=\FP@xfa\FP@lfb=\FP@xfb%
  723.      \FP@count=1\relax%
  724.      \loop%
  725.         \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@xfa\FP@xfb%
  726.         \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@xfa\FP@xfb%
  727.         \FP@trigo@xy\FP@yfa\FP@yfb\FP@count%
  728.         \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@yfa\FP@yfb%
  729.         \advance\FP@count2\relax%
  730.         \FP@trigo@divn\FP@yfa\FP@yfb\FP@lfa\FP@lfb\FP@count%
  731.         \ifnum\ifnum\FP@yfa=0 0\else1\fi\ifnum\FP@yfb=0 0\else 1\fi>0\relax%
  732.           \advance\FP@rfa\FP@yfa\advance\FP@rfb\FP@yfb%
  733.           \ifnum\FP@rfb<1000000000\relax\else%
  734.             \advance\FP@rfb-1000000000\relax%
  735.         \advance\FP@rfa1\relax%
  736.           \fi%
  737.           \ifnum\FP@rfa<1000000000\relax\else%
  738.             \advance\FP@rfa-1000000000\relax%
  739.         \advance\FP@rib1\relax%
  740.           \fi%
  741.         \repeat%
  742.        \fi%
  743.     \fi%
  744.   \else%
  745.     \FP@errmessage{Number too big}%
  746.   \fi%
  747. }
  748.  
  749. %compute sign(r)*r:=#1.#2#3-abs(r) (for abs(r)<=#1.#2#3)
  750. \def\FP@subrfrom#1#2#3{%
  751.    % #1 integer part of value to subtract from
  752.    % #2 fractional part 1 of value to subtract from
  753.    % #3 fractional part 2 of value to subtract from
  754.    \FP@ria=#1\relax\advance\FP@ria-\FP@rib\FP@rib\FP@ria%
  755.    \FP@ria=#2\relax\advance\FP@ria-\FP@rfa\FP@rfa\FP@ria%
  756.    \FP@ria=#3\relax\advance\FP@ria-\FP@rfb\FP@rfb\FP@ria%
  757.    \FP@ria=0\relax%
  758.    \ifnum\FP@rfb<0\relax%
  759.      \advance\FP@rfb1000000000\relax%
  760.      \advance\FP@rfa-1\relax%
  761.    \fi%
  762.    \ifnum\FP@rfa<0\relax%
  763.      \advance\FP@rfa1000000000\relax%
  764.      \advance\FP@rib-1\relax%
  765.    \fi%
  766.    \ifnum\FP@rib<0\relax%
  767.      \FP@errmessage{Subtraction lead to unaccepted value}%
  768.    \fi%
  769. }
  770.  
  771. %compute r:= pi/2 - abs(r) (for abs(r)<=pi/2)
  772. \def\FP@pihalf@subr{\FP@subrfrom{1}{570796326}{794896619}}
  773.  
  774. %compute sign(r)*r:= pi-abs(r) (for abs(r)<=pi)
  775. \def\FP@pi@subr{\FP@subrfrom{3}{141592653}{589793238}}
  776.  
  777. %compute arcsin
  778.  
  779. \def\FP@arcsin#1#2.#3.#4\relax{%
  780.   % #1 macro, which gets the result
  781.   % #2 integer part of value
  782.   % #3 fractional part of value
  783.   % #4 dummy to swallow everything after the 2nd '.'
  784.   %
  785.   {\FP@beginmessage{ARCSIN}%
  786.    %
  787.    \FP@readvalue{x}{#2}{#3}%
  788.    %
  789.    \FP@arcsincos@loop%
  790.    %
  791.    \ifnum\FP@@arccos=1\relax%
  792.      \FP@pihalf@subr%
  793.    \fi%
  794.    \FP@rs=\FP@xs%
  795.    %
  796.    \FP@store\FP@tmp{r}%
  797.    %
  798.    \global\let\FP@tmp\FP@tmp%
  799.    %
  800.    \FP@endmessage{}%
  801.   }%
  802.   %
  803.   \let#1\FP@tmp%
  804. }
  805.  
  806. %compute arccos
  807. \def\FP@arccos#1#2.#3.#4\relax{%
  808.   % #1 macro, which gets the result
  809.   % #2 integer part of value
  810.   % #3 fractional part of value
  811.   % #4 dummy to swallow everything after the 2nd '.'
  812.   %
  813.   {\FP@beginmessage{ARCCOS}%
  814.    %
  815.    \FP@readvalue{x}{#2}{#3}%
  816.    %
  817.    \FP@arcsincos@loop%
  818.    %
  819.    \ifnum\FP@@arccos=0\relax%
  820.      \FP@pihalf@subr%
  821.    \fi%
  822.    \FP@rs=1%
  823.    \ifnum\FP@xs<0\relax%
  824.      \FP@pi@subr%
  825.    \fi%
  826.    %
  827.    \FP@store\FP@tmp{r}%
  828.    %
  829.    \global\let\FP@tmp\FP@tmp%
  830.    %
  831.    \FP@endmessage{}%
  832.   }%
  833.   %
  834.   \let#1\FP@tmp%
  835. }
  836.  
  837. %compute arcsin and arccos
  838. \def\FP@arcsincos#1#2#3.#4.#5\relax{%
  839.   % #1 macro, which gets the arcsin-result
  840.   % #2 macro, which gets the arccos-result
  841.   % #3 integer part of value
  842.   % #4 fractional part of value
  843.   % #5 dummy to swallow everything after the 2nd '.'
  844.   %
  845.   {\FP@beginmessage{ARCSINCOS}%
  846.    %
  847.    \FP@readvalue{x}{#3}{#4}%
  848.    %
  849.    \FP@arcsincos@loop%
  850.    %
  851.    \FP@xia\FP@ria\FP@xib\FP@rib\FP@xfa\FP@rfa\FP@xfb\FP@rfb%
  852.    %
  853.    \ifnum\FP@@arccos=1\relax%
  854.      \FP@pihalf@subr%
  855.    \fi%
  856.    \FP@rs=\FP@xs%
  857.    \FP@store\FP@tmpa{r}%
  858.    %
  859.    \FP@ria\FP@xia\FP@rib\FP@xib\FP@rfa\FP@xfa\FP@rfb\FP@xfb%
  860.    %
  861.    \ifnum\FP@@arccos=0\relax%
  862.      \FP@pihalf@subr%
  863.    \fi%
  864.    \FP@rs=1%
  865.    \ifnum\FP@xs<0\relax%
  866.      \FP@pi@subr%
  867.    \fi%
  868.    \FP@store\FP@tmpb{r}%
  869.    %
  870.    \global\let\FP@tmpa\FP@tmpa%
  871.    \global\let\FP@tmpb\FP@tmpb%
  872.    %
  873.    \FP@endmessage{}%
  874.   }%
  875.   %
  876.   \let#1\FP@tmpa%
  877.   \let#2\FP@tmpb%
  878. }
  879.  
  880. %compute arctan and arccot
  881.  
  882. %compute 1/y for y>=1
  883. \def\FP@trigo@inv{%
  884.   \FP@shift=0\relax%
  885.   \FP@xia=1000000000\FP@xib=0\FP@xfa=0\FP@xfb=0\relax%
  886.   \loop%
  887.     \ifnum\FP@yia<100000000\relax%
  888.       \FP@multen{y}%
  889.       \advance\FP@shift1\relax%
  890.     \repeat%
  891.   \FP@ria=0\FP@rib=0\FP@rfa=0\FP@rfb=0\relax%
  892.   \loop%
  893.     \ifFP@zero{y}\else%
  894.       \FP@counttimes%divides x by \FP@times*y
  895.       \FP@divten{y}%
  896.       \FP@multen{r}%
  897.       \advance\FP@rfb\FP@times%
  898.       \ifnum\FP@rfb<1000000000\relax\else%
  899.         \advance\FP@rfa1\advance\FP@rfb-1000000000\relax%
  900.         \ifnum\FP@rfa<1000000000\relax\else%
  901.       \advance\FP@rib1\advance\FP@rfa-1000000000\relax%
  902.           \ifnum\FP@rib<1000000000\relax\else%
  903.         \advance\FP@ria1\advance\FP@rib-1000000000\relax%
  904.           \fi%
  905.     \fi%
  906.       \fi%
  907.     \repeat%
  908.     \loop%
  909.       \ifnum\FP@shift<35\relax%
  910.         \advance\FP@shift1\relax%
  911.         \FP@divten{r}%
  912.       \repeat%
  913. }
  914.  
  915. %compute 1/sqrt(1+x^2) for 0<=x<1
  916. \def\FP@trigo@sq\FP@xfa\FP@xfb{%
  917.   \FP@trigo@mul\FP@yfa\FP@yfb\FP@xfa\FP@xfb\FP@xfa\FP@xfb%
  918.   \ifnum\FP@yfb=0\relax\else%
  919.     \FP@yfb=-\FP@yfb%
  920.     \advance\FP@yfb1000000000\relax%
  921.     \advance\FP@yfa1\relax%
  922.   \fi%
  923.   \FP@yfa=-\FP@yfa%
  924.   \advance\FP@yfa1250000000\relax%
  925.   \FP@trigo@mul\FP@yfa\FP@yfb\FP@yfa\FP@yfb{444444444}{444444444}%
  926.   \FP@lfa=666666666\relax\FP@lfb=666666666\relax%
  927.   \FP@rs=1\FP@ria=0\FP@rib=0\FP@rfa=\FP@lfa\FP@rfb=\FP@lfb%
  928.   \FP@count=0\relax%
  929.   \loop%
  930.     \advance\FP@count2\relax%
  931.     \FP@trigo@divn\FP@yia\FP@yib{1000000000}{0}\FP@count%
  932.     \ifnum\ifnum\FP@yia=0 0\else1\fi\ifnum\FP@yib=0 0\else1\fi>0\relax%
  933.       \ifnum\FP@yib=0\relax\else%
  934.         \FP@yib=-\FP@yib%
  935.         \advance\FP@yib1000000000\relax%
  936.         \advance\FP@yia1\relax%
  937.       \fi%
  938.       \ifnum\FP@yia=0\relax\else%
  939.         \FP@yia=-\FP@yia%
  940.         \advance\FP@yia1000000000\relax%
  941.       \fi%
  942.       \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@yia\FP@yib%
  943.     \fi%
  944.     \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@yfa\FP@yfb%
  945.     \ifnum\ifnum\FP@lfa=0 0\else1\fi\ifnum\FP@lfb=0 0\else1\fi=0\relax\else%
  946.       \advance\FP@rfb\FP@lfb%
  947.       \ifnum\FP@rfb<1000000000\relax\else%
  948.         \advance\FP@rfa1\relax%
  949.     \advance\FP@rfb-1000000000\relax%
  950.       \fi%
  951.       \advance\FP@rfa\FP@lfa%
  952.       \ifnum\FP@rfa<1000000000\relax\else%
  953.         \advance\FP@rib1\relax%
  954.     \advance\FP@rfa-1000000000\relax%
  955.       \fi%
  956.   \repeat%
  957. }
  958.  
  959. %compute arctan for 0<=x<=0.5
  960. \def\FP@@arctan{%
  961.   \ifnum\ifnum\FP@xfa=0 0\else1\fi\ifnum\FP@xfb=0 0\else1\fi=0\relax%
  962.     \FP@rs=1\FP@ria=0\FP@rib=0\FP@rfa=0\FP@rfb=0\relax%
  963.   \else%
  964.     \FP@rs=1\FP@ria=0\FP@rib=0\FP@rfa=\FP@xfa\FP@rfb=\FP@xfb%
  965.     \FP@lfa=\FP@xfa\FP@lfb=\FP@xfb%
  966.     \FP@trigo@mul\FP@xfa\FP@xfb\FP@xfa\FP@xfb\FP@xfa\FP@xfb%
  967.     \FP@count=1\relax%
  968.     \FP@regs=1\relax%
  969.     \loop%
  970.       \FP@regs=-\FP@regs%
  971.       \advance\FP@count2\relax%
  972.       \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@xfa\FP@xfb%
  973.       \FP@trigo@divn\FP@yfa\FP@yfb\FP@lfa\FP@lfb\FP@count%
  974.       \ifnum\ifnum\FP@yfa=0 0\else1\fi\ifnum\FP@yfb=0 0\else1\fi>0\relax%
  975.         \ifnum\FP@regs<0\relax%
  976.           \advance\FP@rfb-\FP@yfb%
  977.       \ifnum\FP@rfb<0\relax%
  978.         \advance\FP@rfb1000000000\relax%
  979.         \advance\FP@rfa-1\relax%
  980.       \fi%
  981.       \advance\FP@rfa-\FP@yfa%
  982.       \ifnum\FP@rfa<0\relax%
  983.         \advance\FP@rfa1000000000\relax%
  984.         \advance\FP@rib-1\relax%
  985.       \fi%
  986.         \else%
  987.           \advance\FP@rfb\FP@yfb%
  988.       \ifnum\FP@rfb<1000000000\relax\else%
  989.         \advance\FP@rfb-1000000000\relax%
  990.         \advance\FP@rfa1\relax%
  991.       \fi%
  992.       \advance\FP@rfa\FP@yfa%
  993.       \ifnum\FP@rfa<1000000000\relax\else%
  994.         \advance\FP@rfa-1000000000\relax%
  995.         \advance\FP@rib1\relax%
  996.       \fi%
  997.         \fi%
  998.     \repeat%
  999.   \fi%
  1000. }
  1001.  
  1002. %compute arctan
  1003. \def\FP@@arctancot#1#2{%
  1004.   % #1 integer part of value
  1005.   % #2 fractional part of value
  1006.   %
  1007.   \FP@readvalue{x}{#1}{#2}%
  1008.   %
  1009.   \ifnum\ifnum\FP@xia=0 0\else1\fi\ifnum\FP@xib=1 0\else1\fi\ifnum\FP@xfa=0 0\else1\fi\ifnum\FP@xfb=0 0\else1\fi=0\relax%
  1010.     \FP@ria=0\FP@rib=0\FP@rfa=785398163\FP@rfb=397448310\relax%
  1011.     \FP@subfpih=0\relax%
  1012.   \else%
  1013.     \ifnum\ifnum\FP@xia=0 0\else1\fi\ifnum\FP@xib=0 0\else1\fi=0\relax%
  1014.       \FP@subfpih=0\relax%
  1015.     \else%
  1016.       \FP@yia=\FP@xia\FP@yib=\FP@xib\FP@yfa=\FP@xfa\FP@yfb=\FP@xfb%
  1017.       \FP@trigo@inv%
  1018.       \FP@xia=\FP@ria\FP@xib=\FP@rib\FP@xfa=\FP@rfa\FP@xfb=\FP@rfb%
  1019.       \FP@subfpih=1\relax%
  1020.     \fi%
  1021.     \ifnum\FP@xfa>880000000\relax%
  1022.       \FP@trigo@sq\FP@xfa\FP@xfb%
  1023.       \FP@xfa=\FP@rfa\FP@xfb=\FP@rfb%
  1024.       \FP@arcsincos@loop%
  1025.       \ifnum\FP@@arccos=0\relax%
  1026.         \FP@pihalf@subr%
  1027.       \fi%
  1028.     \else%
  1029.       \FP@@arctan\FP@xfa\FP@xfb%
  1030.     \fi%
  1031.   \fi%
  1032.   %
  1033.   \ifnum\FP@subfpih>0\relax%
  1034.     \FP@pihalf@subr%
  1035.   \fi%
  1036.   %
  1037.   \FP@rs=\FP@xs%
  1038. }
  1039.  
  1040. %compute arctan
  1041. \def\FP@arctan#1#2.#3.#4\relax{%
  1042.   % #1 macro, which gets the result
  1043.   % #2 integer part of value
  1044.   % #3 fractional part of value
  1045.   % #4 dummy to swallow everything after the 2nd '.'
  1046.   %
  1047.   {\FP@beginmessage{ARCTAN}%
  1048.    %
  1049.    \FP@@arctancot{#2}{#3}%
  1050.    %
  1051.    \FP@store\FP@tmp{r}%
  1052.    %
  1053.    \global\let\FP@tmp\FP@tmp%
  1054.    %
  1055.    \FP@endmessage{}%
  1056.   }
  1057.   %
  1058.   \let#1\FP@tmp%
  1059. }
  1060.  
  1061. %compute arccot
  1062. \def\FP@arccot#1#2.#3.#4\relax{%
  1063.   % #1 macro, which gets the result
  1064.   % #2 integer part of value
  1065.   % #3 fractional part of value
  1066.   % #4 dummy to swallow everything after the 2nd '.'
  1067.   %
  1068.   {\FP@beginmessage{ARCCOT}%
  1069.    %
  1070.    \FP@@arctancot{#2}{#3}%
  1071.    \ifnum\FP@rs<0\relax%
  1072.      \FP@rs=1\relax%
  1073.      \FP@pihalf@subr%
  1074.      \FP@pi@subr%
  1075.    \else%
  1076.      \FP@pihalf@subr%
  1077.    \fi%
  1078.    %
  1079.    \FP@store\FP@tmp{r}%
  1080.    %
  1081.    \global\let\FP@tmp\FP@tmp%
  1082.    %
  1083.    \FP@endmessage{}%
  1084.   }
  1085.   %
  1086.   \let#1\FP@tmp%
  1087. }
  1088.  
  1089. %compute arctan and arccot
  1090. \def\FP@arctancot#1#2#3.#4.#5\relax{%
  1091.   % #1 macro, which gets the arcsin-result
  1092.   % #2 macro, which gets the arccos-result
  1093.   % #3 integer part of value
  1094.   % #4 fractional part of value
  1095.   % #5 dummy to swallow everything after the 2nd '.'
  1096.   %
  1097.   {\FP@beginmessage{ARCTANCOT}%
  1098.    %
  1099.    \FP@@arctancot{#3}{#4}%
  1100.    \FP@xs\FP@rs\FP@xia\FP@ria\FP@xib\FP@rib\FP@xfa\FP@rfa\FP@xfb\FP@rfb%
  1101.    \FP@store\FP@tmpa{x}%
  1102.    %
  1103.    \ifnum\FP@rs<0\relax%
  1104.      \FP@rs=1\relax%
  1105.      \FP@pihalf@subr%
  1106.      \FP@pi@subr%
  1107.    \else%
  1108.      \FP@pihalf@subr%
  1109.    \fi%
  1110.    \FP@store\FP@tmpb{r}%
  1111.    %
  1112.    \global\let\FP@tmpa\FP@tmpa%
  1113.    \global\let\FP@tmpb\FP@tmpb%
  1114.    %
  1115.    \FP@endmessage{}%
  1116.   }
  1117.   %
  1118.   \let#1\FP@tmpa%
  1119.   \let#2\FP@tmpb%
  1120. }
  1121.